LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

learn_pangolin

2022/5/28

Pangolin笔记

最近有个大作业,需要写个界面,显示用C++的Opencv实现的一些效果

久有耳闻Pangolin,打算用它试试实现,顺便入个门

但是最终因为他的控件只有竖直方向排版(也可能是我了解不深),而且我也没有解决中文乱码的问题

没法满足需求,最终还是打算用QT做,记录一下学习过程


使用Pangolin的感觉就是资料太少了,只有一些零零碎碎的demo

Pangolin的笔记以注释的形式写在代码里(有些不用使用的代码注释掉了作为备忘)

main.cpp

#include <pangolin/pangolin.h>
#include <opencv2/opencv.hpp>

#define pix(x) (pangolin::Attach::Pix(x)) //方便以像素定义画面尺寸

//窗口大小
const short WINDOWS_WIDTH = 640;
const short WINDOWS_HEIGTH = 480;

//上侧选择栏大小
const short TOP_SELECTION_WIDTH = WINDOWS_WIDTH;
const short TOP_SELECTION_HEIGHT = 35;

//左侧选择栏大小
const short LEFT_SELECTION_WIDTH = 128;
const short LEFT_SELECTION_HEIGHT = WINDOWS_HEIGTH - TOP_SELECTION_HEIGHT;

//显示图像大小
const short IMAGE_WIDTH =  WINDOWS_WIDTH - LEFT_SELECTION_WIDTH;
const short IMAGE_HEIGHT =  WINDOWS_HEIGTH - TOP_SELECTION_HEIGHT;

void function()
{
    std::cout << "In the function" << std::endl;
}

int main()
{ 
    //创建窗口 窗口名 宽 高
    pangolin::CreateWindowAndBind("Main",WINDOWS_WIDTH,WINDOWS_HEIGTH);

    //设置字体样式
    // pangolin::GlFont * font = new pangolin::GlFont("../font/simhei.ttf", 60.0);

    //打开颜色混合 以及颜色混合方式 省略则字体无法正常显示
    // glEnable(GL_BLEND);
    // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
    //开启深度测试 窗口中只会绘制面朝相机的那一面像素 绘制3D就要打开
    // glEnable(GL_DEPTH_TEST);

    //设置相机
    // ProjectionMatrix指定内参 (高 宽 fx fy cx cy 最近视距 最远视距)
    // ModelViewLookAt指定外参 相机所在x,y,z 视点x,y,z 相机轴
    // pangolin::OpenGlRenderState camera(
    //         pangolin::ProjectionMatrix(640,480,420,420,320,320,0.2,100),
    //         pangolin::ModelViewLookAt(2,0,2, 0,0,0, pangolin::AxisY));

    //设置视图
    // .SetBounds 设置位置大小属性 分别对应(bottom, top, left, right)的比例 也可以用pangolin::Attach::Pix(x)指定像素 
    // pangolin::View& camera_view = pangolin::CreateDisplay()
    //         .SetBounds(0.0, 1.0, 0.0, 1.0, 640.0f/480.0f)
    //         .SetHandler(new pangolin::Handler3D(camera));
    
    // 左侧选择栏
    pangolin::CreatePanel("left_selection").SetBounds(0, pix(LEFT_SELECTION_HEIGHT), 0, pix(LEFT_SELECTION_WIDTH)); 
    pangolin::Var<bool> left_button1("left_selection.Button", false, false);// name 默认值 (toggle为true为选框 为false为按钮)
    pangolin::Var<std::function<void(void)>> left_button2("left_selection.function", function);//按钮回调函数

    // 顶部选择栏
    pangolin::CreatePanel("top_selection").SetBounds(pix(WINDOWS_HEIGTH-TOP_SELECTION_HEIGHT), pix(WINDOWS_HEIGTH), 0, pix(WINDOWS_WIDTH)); 
    pangolin::Var<bool> top_button1("top_selection.Button", false, false);// name 默认值 (toggle为true为选框 为false为按钮)

    // 图片
    pangolin::View& image_view = pangolin::Display("rgb").SetBounds(0, pix(IMAGE_HEIGHT), pix(WINDOWS_WIDTH - IMAGE_WIDTH), pix(LEFT_SELECTION_WIDTH+IMAGE_WIDTH));// 建立图片视图
    pangolin::GlTexture imageTexture(IMAGE_WIDTH,IMAGE_HEIGHT); // 图片容器 width height
    cv::Mat image = cv::imread("../test.jpg"); //读取图像
    cv::resize(image,image,cv::Size(IMAGE_WIDTH,IMAGE_HEIGHT));
    imageTexture.Upload(image.data,GL_BGR,GL_UNSIGNED_BYTE);//将图片放入容器 BGR格式 无符号

    while(!pangolin::ShouldQuit()) //如果没退出界面
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清空颜色和深度缓存

        //显示相机
        // camera_view.Activate(camera);

        if (pangolin::Pushed(left_button1))
        {
            std::cout << "In Button" << std::endl;
        }

        //显示图片
        // image_view.Activate();
        // imageTexture.RenderToViewportFlipY(); // 要翻转y不然图像为上下颠倒 原型为RenderToViewport();

        //显示字体
        // glColor3f(0.0,0.0,1.0); //RGB 蓝色
        // std::string tt = "1234";
        // font->Text(tt.c_str()).Draw(200, 200, 0);

        pangolin::FinishFrame(); //显示
    }

    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(learning_pangolin) 
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE "Debug")

# 使用opencv
find_package( OpenCV REQUIRED ) 
find_package( Pangolin REQUIRED )
include_directories(${OpenCV_INCLUDE_DIRS}) 

add_executable(${PROJECT_NAME}
	main.cpp
) 
target_link_libraries(${PROJECT_NAME}
	${OpenCV_LIBS} 
	${Pangolin_LIBRARIES}
)

结果如下:

Pangolin中的按钮是绑定在一个控制板panel上的

我的想法是上侧选择栏的按钮横向排列作为界面切换

但是好像Pangolin没有提供,默认按钮绑定panel后就是竖直排列(也就是和panel基本等宽)

如果实在要在上边横向排列按钮的话,应该可以一个按钮一个panel横向排列过去


总结起来就是,我感觉Pangolin适合做一些简单的交互式的3D的可视化

比较适合与类似SLAM可视化等,左边是简单按钮控制一些逻辑,右边是显示3D位姿之类的画面